using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    // 在Inspector窗口中设置移动速度，方便调整
    public float moveSpeed = 3.5f; // 给一个默认值

    private Rigidbody2D rb;
    private Vector2 moveInput;

    // Awake在游戏对象加载时被调用，通常用于初始化引用
    void Awake()
    {
        // 获取附加在同一个GameObject上的Rigidbody2D组件
        rb = GetComponent<Rigidbody2D>();
    }

    // Update每一帧都会被调用，适合处理输入
    void Update()
    {
        // 读取键盘输入 (W,A,S,D 或 上下左右箭头)
        // GetAxisRaw会立即返回-1, 0, 或 1，没有平滑过渡，适合这种游戏
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveY = Input.GetAxisRaw("Vertical");

        // 根据GDD要求，只能4个方向移动。
        // 这段逻辑确保同一时间只有一个方向的输入被接受，优先水平方向。
        if (moveX != 0)
        {
            moveInput = new Vector2(moveX, 0);
        }
        else if (moveY != 0)
        {
            moveInput = new Vector2(0, moveY);
        }
        else
        {
            moveInput = Vector2.zero;
        }
    }

    // FixedUpdate在固定的时间间隔被调用，所有物理相关的计算都应该在这里
    void FixedUpdate()
    {
        // 移动玩家
        // rb.MovePosition更适合物理移动，它能正确处理碰撞
        // moveSpeed * Time.fixedDeltaTime 将速度（单位/秒）转换为这一帧的移动距离
        rb.MovePosition(rb.position + moveInput.normalized * moveSpeed * Time.fixedDeltaTime);
    }
}